home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Programming / vbcc / pasm / ppcasm.h < prev    next >
C/C++ Source or Header  |  1998-06-24  |  21KB  |  590 lines

  1. /* $VER: pasm ppcasm.h V0.7 (14.12.97)
  2.  *
  3.  * This file is part of pasm, a portable PowerPC assembler.
  4.  * Copyright (c) 1997  Frank Wille
  5.  *
  6.  * pasm is freeware and part of the portable and retargetable ANSI C
  7.  * compiler vbcc, copyright (c) 1995-97 by Volker Barthelmann.
  8.  * pasm may be freely redistributed as long as no modifications are
  9.  * made and nothing is charged for it. Non-commercial usage is allowed
  10.  * without any restrictions.
  11.  * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
  12.  * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
  13.  *
  14.  *
  15.  * v0.7 (14.12.97) phx
  16.  *      Define "NetBSDAmiga68k" changed to "NetBSD68k".
  17.  * v0.6 (30.10.97) phx
  18.  *      More options. GlobalVars: optinstrmode and supermode.
  19.  * v0.5 (12.10.97) phx
  20.  *      Add userdeflist and usrdefs to GlobalVars for symbol definitions
  21.  *      via the command line.
  22.  *      .set allows symbols to be reused.
  23.  *      Last line of a source text was ignored, if newline is missing.
  24.  * v0.4 (05.07.97) phx
  25.  *      Program returns EXIT_FAILURE if an error occurs.
  26.  *      Base address for absolute code may be set with -B option.
  27.  *      EHF support.
  28.  *      Added R_PPC_TOC16 relocation type.
  29.  *      Option -x automatically declares unknown symbols as
  30.  *      externally defined. New GlobalVars entry: autoextern.
  31.  *      Runs on Linux/DEC-Alpha with 64-bit integers.
  32.  *      Changed program name from "PPCasm" to "pasm". Reason: There
  33.  *      is already a PPCasm for Apple Macintosh.
  34.  * v0.3 (20.04.97) phx
  35.  *      Using correct names for PowerPC relocations.
  36.  *      Added little-endian conversion macros.
  37.  * v0.2 (25.03.97) phx
  38.  *      Writes ELF object for 32-bit PowerPC big-endian. Either absolute
  39.  *      or ELF output format may be selected. ELF is default for all
  40.  *      currently supported platforms. PPCasm supports nine different
  41.  *      relocation types (there are much more...).
  42.  *      Compiles and works also under NetBSD/amiga (68k).
  43.  *      Changed function declaration to 'new style' in all sources
  44.  *      (to avoid problems with '...' for example).
  45.  *      Included NetBSD/amiga as supported architecture.
  46.  * v0.1 (11.03.97) phx
  47.  *      First test version with all PowerPC instructions and most
  48.  *      important directives. Only raw, absolute output.
  49.  * v0.0 (14.02.97) phx
  50.  *      File created. Project started.
  51.  */
  52.  
  53. #include <stdlib.h>
  54. #include <stdio.h>
  55. #include <string.h>
  56. #include <stdarg.h>
  57. #include <ctype.h>
  58.  
  59. /* program's name */
  60. #define PNAME "pasm"
  61.  
  62. /* version/revision */
  63. #define VERSION 0
  64. #define REVISION 65
  65.  
  66. /* architecture specific defines */
  67. #if defined (AmigaOS68k)
  68. #define MACHINE "Amiga OS/M68k"
  69. #define BIGENDIAN
  70. #define STDTYPES
  71. #elif defined (AmigaOSPPC)
  72. #define MACHINE "Amiga OS/PowerPC"
  73. #define BIGENDIAN
  74. #define STDTYPES
  75. #elif defined (NetBSD68k)
  76. #define MACHINE "NetBSD/M68k"
  77. #define BIGENDIAN
  78. #define STDTYPES
  79. #elif defined (SolarisSparc)
  80. #define MACHINE "Solaris/Sparc"
  81. #define BIGENDIAN
  82. #define STDTYPES
  83. #elif defined (SunOSSparc)
  84. #define MACHINE "SunOS/Sparc"
  85. #define BIGENDIAN
  86. #define STDTYPES
  87. #elif defined (SCOi386)
  88. #define MACHINE "SCO/i386"
  89. #define LITTLEENDIAN
  90. #define STDTYPES
  91. #elif defined (Linuxi386)
  92. #define MACHINE "Linux/i386"
  93. #define LITTLEENDIAN
  94. #define STDTYPES
  95. #elif defined (LinuxAlpha)
  96. #define MACHINE "Linux/Alpha"
  97. #define LITTLEENDIAN
  98. #define TYPES64BIT
  99. #else
  100. #error Unsupported architecture! Please adapt the source text.
  101. #endif
  102.  
  103. #ifdef STDTYPES
  104. typedef signed char int8;
  105. typedef unsigned char uint8;
  106. typedef signed short int int16;
  107. typedef unsigned short int uint16;
  108. typedef signed long int int32;
  109. typedef unsigned long int uint32;
  110. typedef signed char bool;
  111. #elif defined (TYPES64BIT)
  112. typedef signed char int8;
  113. typedef unsigned char uint8;
  114. typedef signed short int16;
  115. typedef unsigned short uint16;
  116. typedef signed int int32;
  117. typedef unsigned int uint32;
  118. typedef int bool;
  119. #else
  120. #error Unsupported architecture! Please adapt the source text.
  121. #endif
  122.  
  123. /* endian conversion */
  124. #if defined (BIGENDIAN)
  125. #define ECH(x) x
  126. #define ECW(x) x
  127. #define ECVH(x) x
  128. #define ECVW(x) x
  129. #elif defined (LITTLEENDIAN)
  130. #define ECH(x) (((x)&0xff)<<8|((x)&0xff00)>>8)
  131. #define ECW(x) (((x)&0xff)<<24|((x)&0xff00)<<8|((x)&0xff0000)>>8|((x)&0xff000000)>>24)
  132. #define ECVH(x) l2bh(x)
  133. #define ECVW(x) l2bw(x)
  134. #else
  135. #error You have to define either BIGENDIAN or LITTLEENDIAN.
  136. #endif
  137.  
  138.  
  139. /* program constants */
  140.  
  141. #ifndef TRUE
  142. #define TRUE 1
  143. #endif
  144. #ifndef FALSE
  145. #define FALSE 0
  146. #endif
  147. #ifndef NULL
  148. #define NULL 0
  149. #endif
  150.  
  151. #define FNAMEBUFSIZE 1024       /* buffer size for file names */
  152. #define EXPSTACKSIZE 32         /* maximum arguments in an expression */
  153.  
  154.  
  155. /* structures */
  156.  
  157. struct node {
  158.   struct node *next;
  159.   struct node *pred;
  160. };
  161.  
  162. struct list {
  163.   struct node *first;
  164.   struct node *dummy;
  165.   struct node *last;
  166. };
  167.  
  168. struct CPUInstr {
  169.   struct CPUInstr *hash_chain;  /* next instruction in hash chain */
  170.   char *name;                   /* instruction's name */
  171.   uint16 flags;                 /* format flags */
  172.   uint8 type;                   /* instruction format, see defines */
  173.   uint8 opcd;                   /* opcode (bit 0-5) */
  174.   uint8 fieldD;                 /* preset D field (bit 6-10) */
  175.   uint8 fieldA;                 /* preset D field (bit 11-15) */
  176.   uint16 xo;                    /* extended opcode (bit 21-31) */
  177. };
  178. /* CPU instruction formats */
  179. #define T_I 0                   /* Bx */
  180. #define T_B 1                   /* BCx */
  181. #define T_DD 2                  /* LWZ */
  182. #define T_DI 3                  /* ADDI */
  183. #define T_DS 4                  /* LD */
  184. #define T_X 5                   /* AND */
  185. #define T_IMM 6                 /* MTFSFI */
  186. #define T_XLB 7                 /* BCLRx */
  187. #define T_XSPR 8                /* MFSPR */
  188. #define T_XCRM 9                /* MTCRF */
  189. #define T_XFL 10                /* MTFSF */
  190. #define T_XS 11                 /* SRADIx */
  191. #define T_A 12                  /* FMADDx */
  192. #define T_M 13                  /* RLWIMIx */
  193. #define T_MD 14                 /* RLDICx */
  194. #define T_CMP 15                /* CMP */
  195. /* CPU instruction flags */
  196. #define F_SUPP_D 0x01           /* D = 0 */
  197. #define F_SUPP_A 0x02           /* A = 0 */
  198. #define F_SUPP_B 0x04           /* B = 0 */
  199. #define F_SUPP_C 0x08           /* C = 0 */
  200. #define F_CRF_D 0x10            /* D = CR field */
  201. #define F_CRF_S 0x20            /* S = CR field */
  202. #define F_SWAP 0x40             /* S instr.: D = S, A and S are swapped */
  203. #define F_SIGNED 0x80           /* 16 bit signed immediate */
  204. #define F_64BIT 0x100           /* 64 bit instruction */
  205. #define F_SUPER 0x200           /* supervisor-only instruction */
  206. #define F_OPTIONAL 0x400        /* optional instruction */
  207. #define F_EXTENDED 0x8000       /* extended mnemonic */
  208.  
  209. struct Directive {
  210.   struct Directive *hash_chain; /* next directive in hash chain */
  211.   char *name;                   /* directive's name */
  212.   void (*dfunct)();
  213. };
  214.  
  215. struct Macro {
  216.   struct Macro *hash_chain;     /* next macro in hash chain */
  217.   char *name;                   /* macro's name */
  218.   char *text;                   /* ptr to first macro line */
  219.   unsigned long nlines;         /* number of lines in this macro */
  220. };
  221.  
  222. struct Section {
  223.   struct node n;
  224.   char *name;                   /* section's name */
  225.   uint8 type;                   /* type: code, data, bss, offsets, ... */
  226.   uint8 flags;
  227.   uint8 protection;             /* readable, writable, executable, ... */
  228.   uint8 alignment;              /* number of bits, which have to be zero */
  229.   unsigned long pc;             /* current program counter (sect. offset) */
  230.   unsigned long size;           /* size of section in bytes */
  231.   void *contents;               /* contents, allocated in pass 2 */
  232.   void *data;
  233.   struct list reloclist;        /* section offsets to relocate */
  234.   struct list xreflist;         /* external references in this section */
  235.   uint32 index;                 /* e.g. section header index for ELF */
  236. };
  237. /* section types */
  238. #define ST_UNDEFINED 0
  239. #define ST_CODE 1               /* section contains code */
  240. #define ST_DATA 2               /* section contains initialized data */
  241. #define ST_UDATA 3              /* section contains uninitialized data */
  242. #define ST_STRUCT 4             /* offset section (will be discarded) */
  243. /* section flags */
  244. #define SF_DISCARD 1            /* can be discarded (e.g. ST_STRUCT) */
  245. #define SF_UNINITIALIZED 2      /* section has uninitialized contents */
  246. /* protection */
  247. #define SP_READ 1
  248. #define SP_WRITE 2
  249. #define SP_EXEC 4
  250. #define SP_SHARE 8
  251.  
  252. struct Symbol {
  253.   struct Symbol *hash_chain;    /* next symbol in hash chain */
  254.   char *name;                   /* symbol's name */
  255.   uint32 value;                 /* absolute value or relocation offset */
  256.   struct Section *relsect;      /* symbol def. relative to this section */
  257.   uint8 type;                   /* absolute, relocatable or extern */
  258.   uint8 flags;
  259.   uint8 info;                   /* section, function or object */
  260.   uint8 bind;                   /* local or global */
  261.   uint32 size;                  /* object's size in bytes */
  262. };
  263. /* symbol type */
  264. #define SYM_UNDEF 0
  265. #define SYM_ABS 1
  266. #define SYM_RELOC 2
  267. #define SYM_EXTERN 3
  268. /* object type */
  269. #define SYMI_NOTYPE 0
  270. #define SYMI_OBJECT 1
  271. #define SYMI_FUNC 2
  272. #define SYMI_SECTION 3
  273. #define SYMI_FILE 4
  274. /* symbol bind */
  275. #define SYMB_NONE 0
  276. #define SYMB_LOCAL 1
  277. #define SYMB_GLOBAL 2
  278. #define SYMB_WEAK 3
  279.  
  280. struct Reloc {
  281.   struct node n;
  282.   unsigned long offset;         /* section-offset of relocation */
  283.   uint32 addend;                /* add this to relocation value */
  284.   struct Section *relocsect;    /* base addr of this sect. has to be added */
  285.   uint8 type;
  286. };
  287. /* reloc types (identical with the reloc types used for ELF) */
  288. #define R_NONE 0
  289. #define R_PPC_ADDR32 1          /* 32-bit relocation */
  290. #define R_PPC_ADDR24 2          /* 26-bit relocation for B-instruction */
  291. #define R_PPC_ADDR16 3          /* 16-bit relocation */
  292. #define R_PPC_ADDR16_LO 4       /* relocation of the lower half-word */
  293. #define R_PPC_ADDR16_HI 5       /* relocation of the higher half-word */
  294. #define R_PPC_ADDR16_HA 6       /* higher half-word reloc. for ADDI */
  295. #define R_PPC_ADDR14 7          /* BC-instruction, 16-bit absolute */
  296. #define R_PPC_ADDR14_BRTAKEN 8
  297. #define R_PPC_ADDR14_BRNTAKEN 9
  298. #define R_PPC_REL24 10          /* relative 26-bit (PowerPC B-instruction) */
  299. #define R_PPC_REL14 11          /* BC-instruction, 16-bit relative */
  300. #define R_PPC_REL14_BRTAKEN 12
  301. #define R_PPC_REL14_BRNTAKEN 13
  302. #define R_PPC_GOT16 14
  303. #define R_PPC_GOT16_LO 15
  304. #define R_PPC_GOT16_HI 16
  305. #define R_PPC_GOT16_HA 17
  306. #define R_PPC_PLTREL24 18
  307. #define R_PPC_COPY 19
  308. #define R_PPC_GLOB_DAT 20
  309. #define R_PPC_JMP_SLOT 21
  310. #define R_PPC_RELATIVE 22
  311. #define R_PPC_LOCAL24PC 23
  312. #define R_PPC_UADDR32 24
  313. #define R_PPC_UADDR16 25
  314. #define R_PPC_REL32 26          /* section base offset */
  315. #define R_PPC_PLT32 27
  316. #define R_PPC_PLTREL32 28
  317. #define R_PPC_PLT16_LO 29
  318. #define R_PPC_PLT16_HI 30
  319. #define R_PPC_PLT16_HA 31
  320. #define R_PPC_SDAREL16 32
  321. #define R_PPC_SECTOFF 33
  322. #define R_PPC_SECTOFF_LO 34
  323. #define R_PPC_SECTOFF_HI 35
  324. #define R_PPC_SECTOFF_HA 36
  325. #define R_PPC_TOC16 255
  326.  
  327. struct XReference {
  328.   struct node n;
  329.   struct Symbol *xsymbol;       /* external symbol, which is referenced */
  330.   unsigned long offset;
  331.   uint32 addend;
  332.   uint8 type;                   /* relocation type, see struct Reloc */
  333.   uint8 size;                   /* size of reference in bytes (3 = 26bit) */
  334. };
  335.  
  336. struct ParsedLine {
  337.   uint8 type;                   /* opcode type */
  338.   uint8 flags;
  339.   int8 branch_hint;             /* 0=no hint, 1=b. taken(+), -1=not taken(-)*/
  340.   uint8 narg;                   /* value for $NARG, when calling macro */
  341.   char *lineptr;                /* ptr to source text line */
  342.   void *opcode;                 /* ptr to CPUInstr, Directive or SourceText */
  343.   char *operand;                /* ptr to operand-string */
  344. };
  345. /* opcode types */
  346. #define OT_IGNORE 0             /* line is empty or commented out */
  347. #define OT_INSTRUCTION 1
  348. #define OT_DIRECTIVE 2
  349. #define OT_MACRO 3
  350. #define OT_SECTION 4
  351. /* flags */
  352. #define PLF_NONEWLINE 1         /* new statement is still part of same line */
  353. #define PLF_ALIGN 2
  354.  
  355. struct SourceText {             /* start address and size of all text files */
  356.   struct node n;
  357.   char *name;                   /* name of source, include file or macro */
  358.   char *text;                   /* source text pointer */
  359.   unsigned long nlines;         /* number of lines in source text */
  360.   struct ParsedLine *plin;      /* ParsedLine structures for nlines */
  361. };
  362.  
  363. #define MAX_MACPARAMS 10        /* macro parameters \0-\9 */
  364. struct MacroParams {
  365.   char *param[MAX_MACPARAMS];   /* parameter strings, which replace \x */
  366.   uint32 call_id;               /* macro call id */
  367.   uint32 narg;                  /* number of arguments */
  368.   char param0[2];               /* parameter 0 contains the branch hint */
  369. };
  370.  
  371. struct SourceThread {           /* main source, includes and macros */
  372.   struct SourceThread *prev;    /* previous source thread */
  373.   struct MacroParams *macro;    /* only assigned in macro mode */
  374.   struct SourceText *csource;   /* ptr to current source text node */
  375.   char *lineptr;                /* source text pointer to current line */
  376.   char *srcptr;                 /* current source text pointer */
  377.   unsigned long line;           /* current line inside this thread */
  378.   struct Macro *macskip;        /* indicates macro skip mode */
  379. };
  380.  
  381. struct Expression {
  382.   uint32 value;
  383.   uint8 type;                   /* same type definitions as used for Symbol */
  384.   uint8 reloctype;              /* see struct Reloc */
  385.   struct Symbol *symbol;        /* reloc or extern symbol, used in exp. */
  386. };
  387.  
  388. struct UserDefine {
  389.   struct node n;
  390.   char *line;                   /* .set <symbol>,<assignment> */
  391. };
  392.  
  393.  
  394. #define DEF_MAXERRORS 5
  395. #define MAX_INCPATHS 8
  396. #define MAX_IFLEVELS 16
  397. #define LINEBUFSIZE 1024
  398. #define STRBUFSIZE 256
  399. /* number of entries in hash tables */
  400. #define SYMHTABSIZE 0x4000      /* symbol hash table */
  401. #define INSTRHTABSIZE 0x1000    /* instruction hash table */
  402. #define DIRHTABSIZE 0x800       /* directive hash table */
  403. #define MACROHTABSIZE 0x800     /* macro hash table */
  404. /* supported output formats */
  405. #define OFMT_ABSOLUTE 0
  406. #define OFMT_ELF 1
  407. #define OFMT_EHF 2
  408. #define OFMT_LAST 2
  409.  
  410. struct GlobalVars {
  411.   char *source_name;            /* source text file name */
  412.   char *dest_name;              /* output file name */
  413.  
  414.   /* options */
  415.   bool dontwarn;                /* suppress warnings */
  416.   bool noregsymbols;            /* don't predefine register symbols etc. */
  417.   bool noextmnemo;              /* no extended mnemonics */
  418.   bool sixtyfourmode;           /* 64-bit mode activated */
  419.   bool optinstrmode;            /* optional instructions */
  420.   bool supermode;               /* supervisor mode instructions */
  421.   bool autoextern;              /* autom. declare undef. sym. as extern */
  422.   uint8 output;                 /* output format */
  423.   struct list userdeflist;      /* user defines */
  424.   bool usrdefs;
  425.  
  426.   int maxerrors;                /* # of errors to display, before aborting */
  427.   int errcnt;                   /* number of errors displayed */
  428.   int returncode;               /* return code for exit() */
  429.   char *incpaths[MAX_INCPATHS]; /* paths where to search for files */
  430.   char *ident;                  /* unit identification or comment */
  431.   char *file;                   /* source file name for debugging */
  432.   unsigned long absbase;        /* base address for absolute code */
  433.   struct list sourcelist;       /* source text list */
  434.   struct list sectionlist;      /* defined sections */
  435.  
  436.   struct SourceThread *cthread; /* current source thread */
  437.   struct Section *csect;        /* current section */
  438.   struct Symbol *lcsym;         /* location counter symbol '$' */
  439.   struct Symbol *nargsym;       /* symbol for number of arguments '$NARG' */
  440.   uint32 macrocnt;              /* incremented on every macro invocation */
  441.   unsigned long absline;        /* absolute line number */
  442.   uint8 pass;                   /* 0 or 1 */
  443.   uint8 iflevel;                /* current level for conditional assembly */
  444.   uint8 ifignore;               /* number of else/endifs to ignore */
  445.   bool ifcond[MAX_IFLEVELS];    /* ifcond[0] is always TRUE */
  446.   bool signedexp;               /* current expression to eval is signed */
  447.   bool alignflag,vc;
  448.  
  449.   /* TOC */
  450.   int rtoc;                     /* register number for toc-mode */
  451.   struct Section *tocsect;      /* ptr to TOC section, or NULL */
  452.  
  453.   /* hash tables */
  454.   struct Symbol **symbols;      /* symbol hash table */
  455.   struct CPUInstr **instr;      /* instruction hash table */
  456.   struct Directive **directives; /* directive hash table */
  457.   struct Macro **macros;        /* macro hash table */
  458.  
  459.   /* buffers */
  460.   char linebuf[LINEBUFSIZE];    /* buffer for a whole source text line */
  461.   char strbuf[STRBUFSIZE];      /* string buffer for labels, opcodes, etc. */
  462.   uint8 alignment_bytes[4];     /* four zero bytes */
  463. };
  464.  
  465.  
  466. /* global functions */
  467.  
  468. /* main.c */
  469. #ifndef MAIN_C
  470. extern struct GlobalVars gvars;
  471. extern void cleanup(struct GlobalVars *);
  472. #endif
  473.  
  474. /* version.c */
  475. #ifndef VERSION_C
  476. extern void show_version(void);
  477. extern void show_usage(void);
  478. #endif
  479.  
  480. /* pass.c */
  481. #ifndef PASS_C
  482. extern void exec_pass1(struct GlobalVars *);
  483. extern void pass1(struct GlobalVars *,struct SourceText *,
  484.                   struct MacroParams *,struct SourceThread *);
  485. extern struct SourceText *include_source(struct GlobalVars *,char *);
  486. extern void exec_pass2(struct GlobalVars *);
  487. extern void pass2(struct GlobalVars *,struct SourceText *,
  488.                   struct MacroParams *,struct SourceThread *);
  489. extern struct SourceText *get_source(struct GlobalVars *);
  490. #endif
  491.  
  492. /* support.c */
  493. #ifndef SUPPORT_C
  494. extern void *alloc(size_t);
  495. extern void *alloczero(size_t);
  496. extern char *allocstring(char *);
  497. extern void initlist(struct list *);
  498. extern void addtail(struct list *,struct node *);
  499. extern struct node *remhead(struct list *);
  500. extern struct node *remnode(struct node *);
  501. extern char *mapfile(struct GlobalVars *,char *);
  502. extern void checkrange(uint32,int,bool);
  503. extern void lower_case(char *);
  504. #ifdef LITTLEENDIAN
  505. extern uint16 l2bh(uint16);
  506. extern uint32 l2bw(uint32);
  507. #endif
  508. #endif
  509.  
  510. /* eval.c */
  511. #ifndef EVAL_C
  512. extern char *getsymbol(struct GlobalVars *,char *);
  513. extern char *getarg(struct GlobalVars *,char *);
  514. extern char *skipspaces(char *);
  515. extern char *remquotes(char *);
  516. extern void checkEOL(char *);
  517. extern char *skipexpression(struct GlobalVars *,char *);
  518. extern void read_macro_params(struct GlobalVars *,struct ParsedLine *,
  519.                               struct MacroParams *,char *);
  520. extern char *getexp(struct GlobalVars *,char *,uint32 *,uint8);
  521. extern uint32 makereloc(struct GlobalVars *,struct Expression *);
  522. extern uint32 makexref(struct GlobalVars *,struct Expression *,uint8);
  523. extern char *getintexp(struct GlobalVars *,char *,uint32 *);
  524. extern char *eval_expression(struct GlobalVars *,struct Expression *,char *);
  525. #endif
  526.  
  527. /* tables.c */
  528. #ifndef TABLES_C
  529. extern void init_hashtables(struct GlobalVars *);
  530. extern void add_macro(struct GlobalVars *,struct Macro *);
  531. extern struct Symbol *add_symbol(struct GlobalVars *,char *,uint8,uint32);
  532. extern unsigned long elf_hash(unsigned char *);
  533. extern struct Symbol *search_symbol(struct GlobalVars *,char *);
  534. extern struct Section *search_section(struct GlobalVars *,char *);
  535. extern void search_opcode(struct GlobalVars *,struct ParsedLine *,
  536.                           char *,char *);
  537. #endif
  538.  
  539. /* errors.c */
  540. #ifndef ERRORS_C
  541. extern void error(int,...);
  542. extern void ierror(char *,...);
  543. #endif
  544.  
  545. /* predefs.c */
  546. extern char stdsects[];
  547. extern char stdsets[];
  548. extern char *xmnemos[];
  549.  
  550. /* elfrelocnames.c */
  551. extern char *elfrel_name[];
  552. #define ELFRELNAMMSK 0x3f  /* number of names in elfrel_name[] minus 1 */
  553.  
  554. /* instructions.c */
  555. #ifndef INSTRUCTIONS_C
  556. extern struct CPUInstr instructions[];
  557. extern void instr(struct GlobalVars *,struct ParsedLine *);
  558. extern char *check_comma(char *);
  559. extern void pcadd(struct GlobalVars *,unsigned long);
  560. extern void store_byte(struct GlobalVars *,uint8);
  561. extern void store_half(struct GlobalVars *,uint16);
  562. extern void store_word(struct GlobalVars *,uint32);
  563. extern void store_float(struct GlobalVars *,double);
  564. extern void store_double(struct GlobalVars *,double);
  565. extern void store_space(struct GlobalVars *,unsigned long);
  566. #endif
  567.  
  568. /* directives.c */
  569. #ifndef DIRECTIVES_C
  570. extern struct Directive directives[];
  571. extern void activate_section(struct GlobalVars *,struct Section *);
  572. extern void alignment(struct GlobalVars *,unsigned long);
  573. extern char escchar(char);
  574. #endif
  575.  
  576. /* output_abs.c */
  577. #ifndef OUTPUT_ABS_C
  578. extern void output_absolute(struct GlobalVars *);
  579. #endif
  580.  
  581. /* output_elf.c */
  582. #ifndef OUTPUT_ELF_C
  583. extern void output_elf32msb(struct GlobalVars *);
  584. #endif
  585.  
  586. /* output_ehf.c */
  587. #ifndef OUTPUT_EHF_C
  588. extern void output_ehf(struct GlobalVars *);
  589. #endif
  590.